﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using System.Drawing;

namespace TCC_Hotel.Apresentacao.Estoque
{
    public partial class ListarProdutosFaltantes : System.Web.UI.Page
    {
        List<Produto> produtos = null;
        EstoqueService servico = new EstoqueService();
        LoginService servico_Login = new LoginService();

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
          
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Listar_Estoque)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Compra)
            {
                btnCadastrar.Visible = false;

            }

            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Editar_Estoque)
            {
                //tira as colunas nao permitida do usuario
                for (int i = 0; i < grdEstoque.Columns.Count; i++)
                {
                    if (grdEstoque.Columns[i].AccessibleHeaderText == "Editar")
                    {
                        grdEstoque.Columns[i].Visible = false;
                    }
                }

            }

            if (!IsPostBack)
            {              

                //limpa o chache existente para pegar os dados mais atualizados
                HttpContext.Current.Cache.Remove("Lista_Produtos_Estoque_Faltantes");

                //recupera todos os produtos do banco de dados          
                ReloadGridView();
            }
        }

        /// <summary>
        /// Evento do botão de filtrar os nomes para facilitar a busca
        /// </summary>
        protected void btnBusca_Click(object sender, EventArgs e)
        {
            ReloadGridView();
        }

        /// <summary>
        /// Limpa a busca
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtBusca.Text = null;
            ReloadGridView();
        }


        /// <summary>
        /// Faz o reload do gridview quando necessário e consulta o cache
        /// </summary>
        private void ReloadGridView()
        {
            //Consulta os Produtos no serviço. Nele será verificado o cache
            produtos = servico.ListarProdutosFaltantesEstoqueCache();

            produtos = produtos.Where(i => i.NomeProduto.ToUpper().Contains(txtBusca.Text.ToUpper())).ToList();

            //popular gridView
            grdEstoque.DataSource = produtos;
            grdEstoque.DataBind();

           
        }


        /// <summary>
        /// Evento chamado a cada nova linha criada. O evento verificará se o produto esta proximo a quantidade
        /// minima permitira. Se tiver 10 unidades próximas a celular ficara amarela, se estiver abaixo, ficara vermelha    
        /// </summary>
        protected void grdEstoque_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            int qntMinima = 0, quantidade = 0;
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //Pega o valor correspondente a coluna Ativo
                quantidade = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "QuantidadeEstoque").ToString());

                //Pega o valor correspondente a coluna Ativo
                qntMinima = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "QuantidadeMinima").ToString());

                //Se quantidade for menor ou igual a quantidade minima, pinta a celula de vermelho
                if (quantidade < qntMinima)
                {
                    e.Row.Cells[2].BackColor = Color.OrangeRed;
                    e.Row.Cells[2].ForeColor = Color.White;
                }
                //Se a diferença entra quantidade e quantidade minima for menor que 20% da quantidade minima, pinta de amarelo

                else if (quantidade <= (qntMinima * 1.20))
                {
                    e.Row.Cells[2].BackColor = Color.Yellow;
                }
                //Recupera o usuario corrente
                string usuario = Request.ServerVariables["AUTH_USER"].ToString();
                if (!servico_Login.RecuperarPermissaoCache(usuario).Editar_Estoque)
                {
                    e.Row.Cells[4].Text = "Sem permissão";
                    e.Row.Cells[4].ForeColor = Color.DarkRed;
                    e.Row.Cells[4].BorderColor = Color.DarkBlue;
                    e.Row.Cells[4].Width = 125;
                }

            }

        }


        /// <summary>
        /// Evento que controla a paginação e verifica o cache
        /// </summary>
        protected void grdEstoque_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {

            //Consulta os funcionarios no banco
            produtos = servico.ListarProdutosFaltantesEstoqueCache();
            produtos = produtos.Where(i => i.NomeProduto.ToUpper().Contains(txtBusca.Text.ToUpper())).ToList();


            //Na mudança de pagina, chama o evento de aparecer a lista
            grdEstoque.PageIndex = e.NewPageIndex;
            grdEstoque.DataSource = produtos;
            grdEstoque.DataBind();
          
        }

        /// <summary>
        /// Evento de click em algum dos botões 
        /// </summary>
        protected void grdEstoque_RowCommand(object sender, GridViewCommandEventArgs e)
        {

            //Verifica qual o botão que o usuário clicou
            if (e.CommandName == "editarQuantidade")
            {
                //Redireciona para a pagina de detalhes correspondente com o id como parametro
                Response.Redirect("~/Apresentacao/Estoque/EditarQuantidade.aspx?tela=2&id=" + grdEstoque.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text);
            }
        }
        /// <summary>
        /// Evento do botão de cadastrar que chama a tela de cadastro
        /// </summary>
        protected void btnCadastrar_Click(object sender, EventArgs e)
        {
            //Redireciona para a pagina de cadastro
            Response.Redirect("~/Apresentacao/Estoque/ComprarProduto.aspx");

        }
        

    }
}